package iziswing;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import exception.ExecuteFonctionException;

public class Classe {

	public static void executeMethode(Object aClasse, String aNomMethode) throws ExecuteFonctionException{
		executeFonction(aClasse, aNomMethode);
	}
	
	public static void executeMethode(Object aClasse, String aNomMethode,Object aParams) throws ExecuteFonctionException{
		executeFonction(aClasse, aNomMethode, aParams);
	}
	
	public static Object executeFonction(Object aClasse, String aNomMethode) throws ExecuteFonctionException{
		try {
			Method lmethode = aClasse.getClass().getDeclaredMethod(aNomMethode, null);
			lmethode.setAccessible(true);
			return lmethode.invoke(aClasse, null);
		} catch (SecurityException e) {
			throw new ExecuteFonctionException(e);
		} catch (IllegalArgumentException e) { 
			throw new ExecuteFonctionException(e);
		} catch (NoSuchMethodException e) {
			return executePublicFonction(aClasse, aNomMethode);
		} catch (IllegalAccessException e) {
			throw new ExecuteFonctionException(e);
		} catch (InvocationTargetException e) {
			throw new ExecuteFonctionException(e);
		}		
	}
	
	public static Object executeFonction(Object aClasse, String aNomMethode,Object aParams) throws ExecuteFonctionException{
		try {
			Method lmethode = aClasse.getClass().getDeclaredMethod(aNomMethode, aParams.getClass());
			lmethode.setAccessible(true);
			return lmethode.invoke(aClasse, aParams);
		} catch (SecurityException e) {
			throw new ExecuteFonctionException(e);
		} catch (IllegalArgumentException e) {
			throw new ExecuteFonctionException(e);
		} catch (NoSuchMethodException e) {
			return executePublicFonction(aClasse, aNomMethode, aParams);
		} catch (IllegalAccessException e) {
			throw new ExecuteFonctionException(e);
		} catch (InvocationTargetException e) {
			throw new ExecuteFonctionException(e);
		}
	}
	
	public static Object executePublicFonction(Object aClasse, String aNomMethode) throws ExecuteFonctionException{
		try {
			Method lmethode = aClasse.getClass().getMethod(aNomMethode, null);
			return lmethode.invoke(aClasse, null);
		} catch (SecurityException e) {
			throw new ExecuteFonctionException(e);
		} catch (IllegalArgumentException e) { 
			throw new ExecuteFonctionException(e);
		} catch (NoSuchMethodException e) {
			throw new ExecuteFonctionException(e);
		} catch (IllegalAccessException e) {
			throw new ExecuteFonctionException(e);
		} catch (InvocationTargetException e) {
			throw new ExecuteFonctionException(e);
		}		
	}
	
	public static Object executePublicFonction(Object aClasse, String aNomMethode,Object aParams) throws ExecuteFonctionException{
		try {
			Method lmethode = aClasse.getClass().getMethod(aNomMethode, aParams.getClass());
			return lmethode.invoke(aClasse, aParams);
		} catch (SecurityException e) {
			throw new ExecuteFonctionException(e);
		} catch (IllegalArgumentException e) {
			throw new ExecuteFonctionException(e);
		} catch (NoSuchMethodException e) {
			throw new ExecuteFonctionException(e);
		} catch (IllegalAccessException e) {
			throw new ExecuteFonctionException(e);
		} catch (InvocationTargetException e) {
			throw new ExecuteFonctionException(e);
		}
	}
}
